package Method

import (
	"reflect"
)

func IsNull(param interface{}) bool {
	// 场景1：空指针0x0
	if param == nil {
		return true
	}

	// 场景2：指向数值为nil的指针
	value := reflect.ValueOf(param)
	switch value.Kind() {
	case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice, reflect.UnsafePointer:
		return value.IsNil()
	default:
		return false
	}

	return false
}

func HasNull(paramList ...interface{}) bool {
	for i := 0; i < len(paramList); i++ {
		param := paramList[i]
		// 场景1：空指针
		if param == nil {
			return true
		}
		// 场景2：指向数值为nil的指针
		value := reflect.ValueOf(param)
		switch value.Kind() {
		case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice, reflect.UnsafePointer:
			return value.IsNil()
		default:
			return false
		}
	}

	return false
}

func HasEmpty(paramList ...interface{}) bool {
	for i := 0; i < len(paramList); i++ {
		param := paramList[i]
		if isEmpty(param) {
			return true
		}

	}

	return false
}

func isEmpty(param interface{}) bool {
	if param == nil {
		return true
	}

	kind := reflect.TypeOf(param).Kind()

	if kind == reflect.String {
		value := reflect.ValueOf(param)
		return value.Len() == 0
	}
	if kind == reflect.Map {
		value := reflect.ValueOf(param)
		return value.Len() == 0
	}
	if kind == reflect.Slice {
		value := reflect.ValueOf(param)
		return value.Len() == 0
	}
	if kind == reflect.Array {
		value := reflect.ValueOf(param)
		return value.Len() == 0
	}

	panic("Method.HasEmpty，不支持的识别类型，请自行判断")
}
